CK = {
    NOT_NULL    : function (value) { return value.replace(/^\s|\s$/g, '').length > 0 },
	INT			: /^\d+$/,
	ID_CARD		: /^\d{15}$|^\d{17}[\dXx]$/,
	TEL			: /^(?:\d{3,4}-)?\d{7,8}$/,
	MOBILE		: /^\d{11}$/,
	EMAIL		: /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/,
	URL			: /(\w+):\/\/([^:\/]+)(?::(\d+))?([^:?#]*)(?:\?([^#]*))?(?:#(.*))?/,
	QQ			: /^\d{5,10}$/,
	ZIPCODE		: /^\d{6}$/
};
/**********************************************************
/*Regular Array : [element, message, method, allowNull, ok]
/*
/*method  : 接受正则和函数
/*message : 不指定或为空串则使用 element 的 title 属性
/*********************************************************/
function FormChecker(arrRegular, options)
{
	var me = this;
	this.regular = arrRegular;

	arrRegular.forEach(function(re)
	{
		var el = re[0] = $.apply(null, re[0].split(','));

		if(!re[2]) re[2] = CK.NOT_NULL;

		if(el.constructor !== Array) re[0] = el = [el];

		re[1] = el[0].insert('span', { innerHTML:re[1]||el[0].title, className:'error' }, { display:'none' }, 'afterEnd');
		
		el.forEach(function(e)
		{
			$E(e, 'onblur', function() { me.checkSignle.call(me, re) });
		});

		re[4] = me.checkSignle(re, true);
	});
	
	document.forms.item(0).onsubmit = function() { return me.checkAll(arrRegular) }
	this.options = options || {};
}
FormChecker.prototype = {
	resetItem : function(re)
	{
		re[1].style.display = 'none';
		re[0].forEach(function(e) { e.cls().remove('error') });
	},
	errorItem : function(re)
	{
		re[1].style.display = '';
		re[0].forEach(function(e) { e.cls().add('error') });
		return false;
	},
	//单项检查
	//参数re:单项规则; mark:是否返回检查结果
	checkSignle : function(re, mark)
	{
		var pass, checker = re[2], rt = checker.constructor, el = re[0];
    
    //如果检查器是正则, 就检查该规则中的项值
		if(rt === RegExp) pass = el.every(function(e)
		{
			var vl = e.value = e.value.trim();
			//检查规则: 如果允许为空且值为空, 或者符合正则则通过(pass)
			return (re[3] === true && vl === '') || checker.test(vl)
		});
    //如果检查器是函数, 则使用函数检查项值
		else if(rt === Function) pass = el.every(function(e)
	  {
		  return el.length == 1 ? checker(this[0], el[0]) : checker(this, el);
	  }, el.map(function(s) { return s.value = s.value.trim() }));
		//设置检查标志
    re[4] = pass;
    //如果返回检查结果
		if(mark) return pass;
    //否则更新界面状态
		pass ? this.resetItem(re) : this.errorItem(re);
	},
	
	//检查全部项
	//参数: 所有规则物件
	checkAll : function(arrRegular)
	{
		var ok = true, bad = null;
	  //遍历所有规则物件
		arrRegular.forEach(function(re)
		{
		  //如果标志位不为true
			if(!re[4])
			{
			  //设置出错栏位
				if(!bad) bad = re[0][0];
				//设置表单检查未通过
				ok = this.errorItem(re);
			}
		}, this);
		//如果有出错栏位, 则将焦点移向它
		if(bad) try { bad.select() } catch(ex) { bad.focus() };
		//取消表单提交
		return ok && (this.options.checker || function() { return true })();
	}
}
